package com.trade.module.base.repository;

import com.trade.module.base.entity.Role;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

/**
 * Class Description: 角色数据持久层
 *
 * @Version v1.0 2017/4/22 1:49
 * @JDK version 1.8.0_51
 * @Author zfb
 */
@Repository
public interface RoleRepository extends PagingAndSortingRepository<Role, String>, JpaSpecificationExecutor<Role> {

    /**
     * 根据用户Id和数据状态查询角色信息
     *
     * @param userId           用户ID
     * @param roleFlag         角色启用状态
     * @param dataFlag         角色删除状态
     * @param userRoleDataFlag 用户角色删除数据状态
     * @return Iterable<Role> 角色迭代器
     */
    @Query(value = "FROM Role r WHERE r.dataFlag=?3 AND r.roleFlag=?2 AND" +
            " r.id IN (SELECT ur.id FROM UserRole ur WHERE ur.dataFlag=?4 AND ur.userId=?1)")
    Iterable<Role> findRoleByUserId(String userId,
                                    String roleFlag,
                                    String dataFlag,
                                    String userRoleDataFlag);

    /**
     * 根据角色状态查询所有角色
     *
     * @param dataFlag 角色删除状态
     * @param roleFlag 角色启用状态
     * @return Iterable<Role>
     */
    Iterable<Role> findByDataFlagAndRoleFlag(String dataFlag, String roleFlag);

    /**
     * 根据用户id查询用户所属角色
     *
     * @param userId 用户id
     * @param userRoleDataFlag 用户角色删除状态
     * @param roleDataFlag 角色删除状态
     * @param roleFlag 角色启用状态
     * @return Iterable
     */
    @Query(value = "FROM Role r WHERE r.dataFlag=?3 AND r.roleFlag=?4 AND r.id IN " +
            "(SELECT ur.roleId FROM UserRole ur WHERE ur.dataFlag=?2 AND ur.userId=?1)")
    Iterable<Role> findUserByRoleId(String userId, String userRoleDataFlag,
                                    String roleDataFlag, String roleFlag);
}
